knitr::opts_chunk$set(warning = F,message = F)
suppressPackageStartupMessages(library(dplyr))
suppressPackageStartupMessages(library(ggplot2))
suppressPackageStartupMessages(library(lubridate))
library(autoTS)
Le chargement a nécessité le package : prophet
Le chargement a nécessité le package : Rcpp
Le chargement a nécessité le package : rlang

Introduction

What does this package do ?

The autoTS package provides a high level interface for univariate time series predictions. It implements many algorithms, most of them provided by the forecast package. The main goals of the package are :

  • Simplify the preparation of the time series ;
  • Train the algorithms and compare their results, to chose the best one ;
  • Gather the results in a final tidy dataframe

What are the inputs ?

The package is designed to work on one time series at a time. Parallel calculations can be put on top of it (see example below). The user has to provide 2 simple vectors :

  • One with the dates (s.t. the lubridate package can parse them)
  • The second with the corresponding values

Warnings

This package implements each algorithm with a unique parametrization, meaning that the user cannot tweak the algorithms (eg modify SARIMA specfic parameters).

Exemple on real-world data

For this example, we will use the GDP quarterly data of the european countries provided by eurostat. The database can be downloaded from this page and then chose “GDP and main components (output, expenditure and income) (namq_10_gdp)” and then adjust the time dimension to select all available data and download as a csv file with the correct formatting (1 234.56). The csv is in the “Data” folder of this notebook.

dat <- read.csv("Data/namq_10_gdp_1_Data.csv")
str(dat)
'data.frame':   93456 obs. of  7 variables:
 $ TIME              : Factor w/ 177 levels "1975Q1","1975Q2",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ GEO               : Factor w/ 44 levels "Albania","Austria",..: 15 15 15 15 15 15 15 15 15 15 ...
 $ UNIT              : Factor w/ 3 levels "Chain linked volumes (2010), million euro",..: 2 2 2 2 3 3 3 3 1 1 ...
 $ S_ADJ             : Factor w/ 4 levels "Calendar adjusted data, not seasonally adjusted data",..: 4 2 1 3 4 2 1 3 4 2 ...
 $ NA_ITEM           : Factor w/ 1 level "Gross domestic product at market prices": 1 1 1 1 1 1 1 1 1 1 ...
 $ Value             : Factor w/ 19709 levels ":","1 008.3",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ Flag.and.Footnotes: Factor w/ 5 levels "","b","c","e",..: 1 1 1 1 1 1 1 1 1 1 ...
head(dat)

Data preparation

First, we have to clean the data (not too ugly though). First thing is to convert the TIME column into a well known date format that lubridate can handle. In this example, the yq function can parse the date without modification of the column. Then, we have to remove the blank in the values that separates thousands… Finally, we only keep data since 2000 and the unadjusted series in current prices.

After that, we should get one time series per country

dat <- mutate(dat,dates=yq(as.character(TIME)),
              values = as.numeric(stringr::str_remove(Value," "))) %>% 
  filter(year(dates)>=2000 & S_ADJ=="Unadjusted data (i.e. neither seasonally adjusted nor calendar adjusted data)" &
           UNIT == "Current prices, million euro")
NAs introduits lors de la conversion automatique
filter(dat,GEO %in% c("France","Austria")) %>% 
  ggplot(aes(dates,values,color=GEO)) + geom_line() + theme_light() +
  labs(title="GDP of (completely) random countries")

Now we’re good to go !

Prediction on a random country

Let’s see how to use the package on one time series :

  • Extract dates and values of the time series you want to work on
  • Create the object containing all you need afterwards
  • Train algo and determine which one is the best (over the last known year)
  • Implement the best algorithm on full data
ex1 <- filter(dat,GEO=="France") 
preparedTS <- prepare.ts(ex1$dates,ex1$values,"quarter")

## What is in this new object ?
str(preparedTS)
List of 4
 $ obj.ts    : Time-Series [1:77] from 2000 to 2019: 363007 369185 362905 383489 380714 ...
 $ obj.df    :'data.frame': 77 obs. of  2 variables:
  ..$ dates: Date[1:77], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ val  : num [1:77] 363007 369185 362905 383489 380714 ...
 $ freq.num  : num 4
 $ freq.alpha: chr "quarter"
plot.ts(preparedTS$obj.ts)

ggplot(preparedTS$obj.df,aes(dates,val)) + geom_line() + theme_light()


## What is the best model for prediction ?
best.algo <- getBestModel(ex1$dates,ex1$values,"quarter",bagged = T,graph = F)
Registered S3 method overwritten by 'xts':
  method     from
  as.zoo.xts zoo 
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
Registered S3 methods overwritten by 'forecast':
  method             from    
  fitted.fracdiff    fracdiff
  residuals.fracdiff fracdiff
names(best.algo)
[1] "best"        "graph.train" "res.train"  
print(paste("The best algorithm is",best.algo$best))
[1] "The best algorithm is my.prophet"
plotly::ggplotly(best.algo$graph.train)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'htmltools':
  method               from         
  print.html           tools:rstudio
  print.shiny.tag      tools:rstudio
  print.shiny.tag.list tools:rstudio
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

## Build the predictions
final.pred <- my.predictions(preparedTS,best.algo$best)
tail(final.pred,24)
ggplot(final.pred) + geom_line(aes(dates,actual.value),color="black") + 
  geom_line(aes(dates,prophet,linetype=type),color="red") +
  theme_light() 

Not too bad, right ?

Scaling predictions

Let’s say we want to make a prediction for each country in the same time and be the fastest possible \(\rightarrow\) let’s combine the package’s functions with parallel computing. We have to reshape the data to get one column per country and then iterate over the columns of the data frame.

Prepare data

suppressPackageStartupMessages(library(tidyr))
dat.wide <- select(dat,GEO,dates,values) %>% 
  group_by(dates) %>% 
  spread(key = "GEO",value = "values")
head(dat.wide)

Compute bulk predictions

library(doParallel)
Le chargement a nécessité le package : foreach
Le chargement a nécessité le package : iterators
Le chargement a nécessité le package : parallel
pipeline <- function(dates,values)
{
  bm <- getBestModel(dates,values,"quarter",graph = F)
  pred <- prepare.ts(dates,values,"quarter") %>% 
    my.predictions(bm$best)
  return(pred)
}
doMC::registerDoMC(parallel::detectCores()-1) # parallel backend (for UNIX)

system.time({
  res <- foreach(ii=2:ncol(dat.wide),.packages = c("dplyr","autoTS")) %dopar%
  pipeline(dat.wide$dates,pull(dat.wide,ii))
})
utilisateur     système      écoulé 
    512.473       2.167     104.269 
names(res) <- colnames(dat.wide)[-1]
str(res)
List of 44
 $ Albania                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ stlm        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ Austria                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 50422 53180 53881 56123 52911 ...
 $ Belgium                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 62261 65046 62754 68161 64318 ...
 $ Bosnia and Herzegovina                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ stlm        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ Bulgaria                                                                                     :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 2941 3252 4015 4103 3284 ...
 $ Croatia                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ tbats       : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 5266 5811 6409 6113 5777 ...
 $ Cyprus                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 2547 2784 2737 2738 2688 ...
 $ Czechia                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 15027 16430 17229 18191 16677 ...
 $ Denmark                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 42567 44307 43892 47249 44143 ...
 $ Estonia                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 1391 1575 1543 1662 1570 ...
 $ Euro area (12 countries)                                                                     :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ Euro area (19 countries)                                                                     :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ Euro area (EA11-2000, EA12-2006, EA13-2007, EA15-2008, EA16-2010, EA17-2013, EA18-2014, EA19):Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ European Union - 15 countries (1995-2004)                                                    :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ European Union - 27 countries (from 2019)                                                    :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ European Union - 28 countries                                                                :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ Finland                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 31759 33836 34025 36641 34474 ...
 $ France                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 363007 369185 362905 383489 380714 ...
 $ Germany (until 1990 former territory of the FRG)                                             :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 515500 523900 536120 540960 530610 ...
 $ Greece                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ ets         : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 33199 34676 37285 37751 35237 ...
 $ Hungary                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 11516 12630 13194 13955 12832 ...
 $ Iceland                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 2304 2442 2557 2447 2232 ...
 $ Ireland                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 25583 26751 27381 28666 29766 ...
 $ Italy                                                                                        :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 292517 309098 298655 338996 309967 ...
 $ Kosovo (under United Nations Security Council Resolution 1244/99)                            :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ stlm        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
 $ Latvia                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 1848 2165 2238 2382 2005 ...
 $ Lithuania                                                                                    :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ stlm        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 2657 3124 3267 3505 2996 ...
 $ Luxembourg                                                                                   :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 5646 5730 5689 6015 5811 ...
 $ Malta                                                                                        :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 979 1110 1158 1152 1031 ...
 $ Montenegro                                                                                   :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 0 0 0 0 0 ...
  ..$ bagged      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
 $ Netherlands                                                                                  :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 109154 113124 110955 118774 118182 ...
 $ North Macedonia                                                                              :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 901 1052 1033 1108 986 ...
 $ Norway                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 44900 43730 46652 50638 48355 ...
 $ Poland                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 41340 44210 46944 54163 47445 ...
 $ Portugal                                                                                     :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 30644 31923 32111 33788 31927 ...
 $ Romania                                                                                      :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 7901 9511 11197 11630 8530 ...
 $ Serbia                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 0 0 0 0 0 ...
 $ Slovakia                                                                                     :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ sarima      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 5100 5722 5764 5752 5343 ...
 $ Slovenia                                                                                     :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ tbats       : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 5147 5591 5504 5667 5407 ...
 $ Spain                                                                                        :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 153378 162400 158526 171946 166204 ...
 $ Sweden                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ stlm        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 67022 73563 68305 73399 66401 ...
 $ Switzerland                                                                                  :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ bats        : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 70048 72725 74957 77476 76092 ...
 $ Turkey                                                                                       :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ actual.value: num [1:89] 59944 70803 82262 82981 60075 ...
  ..$ bagged      : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
 $ United Kingdom                                                                               :Classes ‘tbl_df’, ‘tbl’ and 'data.frame':  89 obs. of  4 variables:
  ..$ dates       : Date[1:89], format: "2000-01-01" "2000-04-01" "2000-07-01" "2000-10-01" ...
  ..$ type        : chr [1:89] NA NA NA NA ...
  ..$ prophet     : num [1:89] NA NA NA NA NA NA NA NA NA NA ...
  ..$ actual.value: num [1:89] 438090 440675 446918 462127 441157 ...

There is no free lunch…

There is no best algorithm in general \(\Rightarrow\) depends on the data !

sapply(res,function(xx) colnames(select(xx,-dates,-type,-actual.value)) ) %>% table()
.
 bagged    bats     ets prophet  sarima    stlm   tbats 
      2       8       1      14      12       5       2 
sapply(res,function(xx) colnames(select(xx,-dates,-type,-actual.value)) )
                                                                                      Albania 
                                                                                       "stlm" 
                                                                                      Austria 
                                                                                    "prophet" 
                                                                                      Belgium 
                                                                                    "prophet" 
                                                                       Bosnia and Herzegovina 
                                                                                       "stlm" 
                                                                                     Bulgaria 
                                                                                     "sarima" 
                                                                                      Croatia 
                                                                                      "tbats" 
                                                                                       Cyprus 
                                                                                     "sarima" 
                                                                                      Czechia 
                                                                                     "sarima" 
                                                                                      Denmark 
                                                                                    "prophet" 
                                                                                      Estonia 
                                                                                     "sarima" 
                                                                     Euro area (12 countries) 
                                                                                       "bats" 
                                                                     Euro area (19 countries) 
                                                                                       "bats" 
Euro area (EA11-2000, EA12-2006, EA13-2007, EA15-2008, EA16-2010, EA17-2013, EA18-2014, EA19) 
                                                                                       "bats" 
                                                    European Union - 15 countries (1995-2004) 
                                                                                       "bats" 
                                                    European Union - 27 countries (from 2019) 
                                                                                       "bats" 
                                                                European Union - 28 countries 
                                                                                       "bats" 
                                                                                      Finland 
                                                                                     "sarima" 
                                                                                       France 
                                                                                    "prophet" 
                                             Germany (until 1990 former territory of the FRG) 
                                                                                    "prophet" 
                                                                                       Greece 
                                                                                        "ets" 
                                                                                      Hungary 
                                                                                    "prophet" 
                                                                                      Iceland 
                                                                                       "bats" 
                                                                                      Ireland 
                                                                                     "sarima" 
                                                                                        Italy 
                                                                                    "prophet" 
                            Kosovo (under United Nations Security Council Resolution 1244/99) 
                                                                                       "stlm" 
                                                                                       Latvia 
                                                                                     "sarima" 
                                                                                    Lithuania 
                                                                                       "stlm" 
                                                                                   Luxembourg 
                                                                                     "sarima" 
                                                                                        Malta 
                                                                                    "prophet" 
                                                                                   Montenegro 
                                                                                     "bagged" 
                                                                                  Netherlands 
                                                                                     "sarima" 
                                                                              North Macedonia 
                                                                                     "sarima" 
                                                                                       Norway 
                                                                                    "prophet" 
                                                                                       Poland 
                                                                                    "prophet" 
                                                                                     Portugal 
                                                                                    "prophet" 
                                                                                      Romania 
                                                                                     "sarima" 
                                                                                       Serbia 
                                                                                    "prophet" 
                                                                                     Slovakia 
                                                                                     "sarima" 
                                                                                     Slovenia 
                                                                                      "tbats" 
                                                                                        Spain 
                                                                                    "prophet" 
                                                                                       Sweden 
                                                                                       "stlm" 
                                                                                  Switzerland 
                                                                                       "bats" 
                                                                                       Turkey 
                                                                                     "bagged" 
                                                                               United Kingdom 
                                                                                    "prophet" 
LS0tCnRpdGxlOiAiUGFja2FnZSBhdXRvVFMgOiBhdXRvbWF0aWMgbW9kZWwgc2VsZWN0aW9uIDxicj4gZm9yIHVuaXZhcmlhdGUgdGltZSBzZXJpZXMgcHJlZGljdGlvbiIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQotLS0KCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQod2FybmluZyA9IEYsbWVzc2FnZSA9IEYpCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGRwbHlyKSkKc3VwcHJlc3NQYWNrYWdlU3RhcnR1cE1lc3NhZ2VzKGxpYnJhcnkoZ2dwbG90MikpCnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KGx1YnJpZGF0ZSkpCmxpYnJhcnkoYXV0b1RTKQpgYGAKCgojIEludHJvZHVjdGlvbgoKIyMgV2hhdCBkb2VzIHRoaXMgcGFja2FnZSBkbyA/CgpUaGUgYGF1dG9UU2AgcGFja2FnZSBwcm92aWRlcyBhIGhpZ2ggbGV2ZWwgaW50ZXJmYWNlIGZvciAqKnVuaXZhcmlhdGUgdGltZSBzZXJpZXMqKiBwcmVkaWN0aW9ucy4gSXQgaW1wbGVtZW50cyBtYW55IGFsZ29yaXRobXMsIG1vc3Qgb2YgdGhlbSBwcm92aWRlZCBieSB0aGUgYGZvcmVjYXN0YCBwYWNrYWdlLiBUaGUgbWFpbiBnb2FscyBvZiB0aGUgcGFja2FnZSBhcmUgOgoKLSBTaW1wbGlmeSB0aGUgcHJlcGFyYXRpb24gb2YgdGhlIHRpbWUgc2VyaWVzIDsKLSBUcmFpbiB0aGUgYWxnb3JpdGhtcyBhbmQgY29tcGFyZSB0aGVpciByZXN1bHRzLCB0byBjaG9zZSB0aGUgYmVzdCBvbmUgOwotIEdhdGhlciB0aGUgcmVzdWx0cyBpbiBhIGZpbmFsICoqdGlkeSBkYXRhZnJhbWUqKiAKCiMjIFdoYXQgYXJlIHRoZSBpbnB1dHMgPwoKVGhlIHBhY2thZ2UgaXMgZGVzaWduZWQgdG8gd29yayBvbiBvbmUgdGltZSBzZXJpZXMgYXQgYSB0aW1lLiBQYXJhbGxlbCBjYWxjdWxhdGlvbnMgY2FuIGJlIHB1dCBvbiB0b3Agb2YgaXQgKHNlZSBleGFtcGxlIGJlbG93KS4gVGhlIHVzZXIgaGFzIHRvIHByb3ZpZGUgMiBzaW1wbGUgdmVjdG9ycyA6CgotIE9uZSB3aXRoIHRoZSBkYXRlcyAocy50LiB0aGUgYGx1YnJpZGF0ZWAgcGFja2FnZSBjYW4gcGFyc2UgdGhlbSkKLSBUaGUgc2Vjb25kIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzCgojIyBXYXJuaW5ncwoKVGhpcyBwYWNrYWdlIGltcGxlbWVudHMgZWFjaCBhbGdvcml0aG0gd2l0aCBhIHVuaXF1ZSBwYXJhbWV0cml6YXRpb24sIG1lYW5pbmcgdGhhdCB0aGUgdXNlciBjYW5ub3QgdHdlYWsgdGhlIGFsZ29yaXRobXMgKGVnIG1vZGlmeSBTQVJJTUEgc3BlY2ZpYyBwYXJhbWV0ZXJzKS4gCgojIEV4ZW1wbGUgb24gcmVhbC13b3JsZCBkYXRhCgpGb3IgdGhpcyBleGFtcGxlLCB3ZSB3aWxsIHVzZSB0aGUgR0RQIHF1YXJ0ZXJseSBkYXRhIG9mIHRoZSBldXJvcGVhbiBjb3VudHJpZXMgcHJvdmlkZWQgYnkgZXVyb3N0YXQuIFRoZSBkYXRhYmFzZSBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIFt0aGlzIHBhZ2VdKGh0dHBzOi8vZWMuZXVyb3BhLmV1L2V1cm9zdGF0L3dlYi9uYXRpb25hbC1hY2NvdW50cy9kYXRhL2RhdGFiYXNlKSBhbmQgdGhlbiBjaG9zZSAiR0RQIGFuZCBtYWluIGNvbXBvbmVudHMgKG91dHB1dCwgZXhwZW5kaXR1cmUgYW5kIGluY29tZSkgKG5hbXFfMTBfZ2RwKSIgYW5kIHRoZW4gYWRqdXN0IHRoZSB0aW1lIGRpbWVuc2lvbiB0byBzZWxlY3QgYWxsIGF2YWlsYWJsZSBkYXRhIGFuZCBkb3dubG9hZCBhcyBhIGNzdiBmaWxlIHdpdGggdGhlIGNvcnJlY3QgZm9ybWF0dGluZyAoMSAyMzQuNTYpLiBUaGUgY3N2IGlzIGluIHRoZSAiRGF0YSIgZm9sZGVyIG9mIHRoaXMgbm90ZWJvb2suCgpgYGB7cn0KZGF0IDwtIHJlYWQuY3N2KCJEYXRhL25hbXFfMTBfZ2RwXzFfRGF0YS5jc3YiKQpzdHIoZGF0KQpoZWFkKGRhdCkKYGBgCgojIyBEYXRhIHByZXBhcmF0aW9uCgpGaXJzdCwgd2UgaGF2ZSB0byBjbGVhbiB0aGUgZGF0YSAobm90IHRvbyB1Z2x5IHRob3VnaCkuIEZpcnN0IHRoaW5nIGlzIHRvIGNvbnZlcnQgdGhlIFRJTUUgY29sdW1uIGludG8gYSB3ZWxsIGtub3duIGRhdGUgZm9ybWF0IHRoYXQgbHVicmlkYXRlIGNhbiBoYW5kbGUuIEluIHRoaXMgZXhhbXBsZSwgdGhlIGB5cWAgZnVuY3Rpb24gY2FuIHBhcnNlIHRoZSBkYXRlIHdpdGhvdXQgbW9kaWZpY2F0aW9uIG9mIHRoZSBjb2x1bW4uIFRoZW4sIHdlIGhhdmUgdG8gcmVtb3ZlIHRoZSBibGFuayBpbiB0aGUgdmFsdWVzIHRoYXQgc2VwYXJhdGVzIHRob3VzYW5kcy4uLgpGaW5hbGx5LCB3ZSBvbmx5IGtlZXAgZGF0YSBzaW5jZSAyMDAwIGFuZCB0aGUgdW5hZGp1c3RlZCBzZXJpZXMgaW4gY3VycmVudCBwcmljZXMuCgpBZnRlciB0aGF0LCB3ZSBzaG91bGQgZ2V0IG9uZSB0aW1lIHNlcmllcyBwZXIgY291bnRyeQoKYGBge3J9CmRhdCA8LSBtdXRhdGUoZGF0LGRhdGVzPXlxKGFzLmNoYXJhY3RlcihUSU1FKSksCiAgICAgICAgICAgICAgdmFsdWVzID0gYXMubnVtZXJpYyhzdHJpbmdyOjpzdHJfcmVtb3ZlKFZhbHVlLCIgIikpKSAlPiUgCiAgZmlsdGVyKHllYXIoZGF0ZXMpPj0yMDAwICYgCiAgICAgICAgICAgU19BREo9PSJVbmFkanVzdGVkIGRhdGEgKGkuZS4gbmVpdGhlciBzZWFzb25hbGx5IGFkanVzdGVkIG5vciBjYWxlbmRhciBhZGp1c3RlZCBkYXRhKSIgJgogICAgICAgICAgIFVOSVQgPT0gIkN1cnJlbnQgcHJpY2VzLCBtaWxsaW9uIGV1cm8iKQoKZmlsdGVyKGRhdCxHRU8gJWluJSBjKCJGcmFuY2UiLCJBdXN0cmlhIikpICU+JSAKICBnZ3Bsb3QoYWVzKGRhdGVzLHZhbHVlcyxjb2xvcj1HRU8pKSArIGdlb21fbGluZSgpICsgdGhlbWVfbGlnaHQoKSArCiAgbGFicyh0aXRsZT0iR0RQIG9mIChjb21wbGV0ZWx5KSByYW5kb20gY291bnRyaWVzIikKYGBgCgpOb3cgd2UncmUgZ29vZCB0byBnbyAhCgojIyBQcmVkaWN0aW9uIG9uIGEgcmFuZG9tIGNvdW50cnkKCkxldCdzIHNlZSBob3cgdG8gdXNlIHRoZSBwYWNrYWdlIG9uIG9uZSB0aW1lIHNlcmllcyA6CgotIEV4dHJhY3QgZGF0ZXMgYW5kIHZhbHVlcyBvZiB0aGUgdGltZSBzZXJpZXMgeW91IHdhbnQgdG8gd29yayBvbgotIENyZWF0ZSB0aGUgb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHlvdSBuZWVkIGFmdGVyd2FyZHMKLSBUcmFpbiBhbGdvIGFuZCBkZXRlcm1pbmUgd2hpY2ggb25lIGlzIHRoZSBiZXN0IChvdmVyIHRoZSBsYXN0IGtub3duIHllYXIpCi0gSW1wbGVtZW50IHRoZSBiZXN0IGFsZ29yaXRobSBvbiBmdWxsIGRhdGEKCmBgYHtyfQpleDEgPC0gZmlsdGVyKGRhdCxHRU89PSJGcmFuY2UiKSAKcHJlcGFyZWRUUyA8LSBwcmVwYXJlLnRzKGV4MSRkYXRlcyxleDEkdmFsdWVzLCJxdWFydGVyIikKCiMjIFdoYXQgaXMgaW4gdGhpcyBuZXcgb2JqZWN0ID8Kc3RyKHByZXBhcmVkVFMpCnBsb3QudHMocHJlcGFyZWRUUyRvYmoudHMpCmdncGxvdChwcmVwYXJlZFRTJG9iai5kZixhZXMoZGF0ZXMsdmFsKSkgKyBnZW9tX2xpbmUoKSArIHRoZW1lX2xpZ2h0KCkKCiMjIFdoYXQgaXMgdGhlIGJlc3QgbW9kZWwgZm9yIHByZWRpY3Rpb24gPwpiZXN0LmFsZ28gPC0gZ2V0QmVzdE1vZGVsKGV4MSRkYXRlcyxleDEkdmFsdWVzLCJxdWFydGVyIixiYWdnZWQgPSBULGdyYXBoID0gRikKbmFtZXMoYmVzdC5hbGdvKQpwcmludChwYXN0ZSgiVGhlIGJlc3QgYWxnb3JpdGhtIGlzIixiZXN0LmFsZ28kYmVzdCkpCnBsb3RseTo6Z2dwbG90bHkoYmVzdC5hbGdvJGdyYXBoLnRyYWluKQoKIyMgQnVpbGQgdGhlIHByZWRpY3Rpb25zCmZpbmFsLnByZWQgPC0gbXkucHJlZGljdGlvbnMocHJlcGFyZWRUUyxiZXN0LmFsZ28kYmVzdCkKdGFpbChmaW5hbC5wcmVkLDI0KQpnZ3Bsb3QoZmluYWwucHJlZCkgKyBnZW9tX2xpbmUoYWVzKGRhdGVzLGFjdHVhbC52YWx1ZSksY29sb3I9ImJsYWNrIikgKyAKICBnZW9tX2xpbmUoYWVzKGRhdGVzLHByb3BoZXQsbGluZXR5cGU9dHlwZSksY29sb3I9InJlZCIpICsKICB0aGVtZV9saWdodCgpIApgYGAKCk5vdCB0b28gYmFkLCByaWdodCA/CgojIFNjYWxpbmcgcHJlZGljdGlvbnMKCkxldCdzIHNheSB3ZSB3YW50IHRvIG1ha2UgYSBwcmVkaWN0aW9uIGZvciBlYWNoIGNvdW50cnkgaW4gdGhlIHNhbWUgdGltZSBhbmQgYmUgdGhlIGZhc3Rlc3QgcG9zc2libGUgJFxyaWdodGFycm93JCBsZXQncyBjb21iaW5lIHRoZSBwYWNrYWdlJ3MgZnVuY3Rpb25zIHdpdGggcGFyYWxsZWwgY29tcHV0aW5nLiBXZSBoYXZlIHRvIHJlc2hhcGUgdGhlIGRhdGEgdG8gZ2V0IG9uZSBjb2x1bW4gcGVyIGNvdW50cnkgYW5kIHRoZW4gaXRlcmF0ZSBvdmVyIHRoZSBjb2x1bW5zIG9mIHRoZSBkYXRhIGZyYW1lLgoKIyMgUHJlcGFyZSBkYXRhIAoKYGBge3J9CnN1cHByZXNzUGFja2FnZVN0YXJ0dXBNZXNzYWdlcyhsaWJyYXJ5KHRpZHlyKSkKZGF0LndpZGUgPC0gc2VsZWN0KGRhdCxHRU8sZGF0ZXMsdmFsdWVzKSAlPiUgCiAgZ3JvdXBfYnkoZGF0ZXMpICU+JSAKICBzcHJlYWQoa2V5ID0gIkdFTyIsdmFsdWUgPSAidmFsdWVzIikKaGVhZChkYXQud2lkZSkKYGBgCgojIyBDb21wdXRlIGJ1bGsgcHJlZGljdGlvbnMKCmBgYHtyfQpsaWJyYXJ5KGRvUGFyYWxsZWwpCnBpcGVsaW5lIDwtIGZ1bmN0aW9uKGRhdGVzLHZhbHVlcykKewogIGJtIDwtIGdldEJlc3RNb2RlbChkYXRlcyx2YWx1ZXMsInF1YXJ0ZXIiLGdyYXBoID0gRikKICBwcmVkIDwtIHByZXBhcmUudHMoZGF0ZXMsdmFsdWVzLCJxdWFydGVyIikgJT4lIAogICAgbXkucHJlZGljdGlvbnMoYm0kYmVzdCkKICByZXR1cm4ocHJlZCkKfQpkb01DOjpyZWdpc3RlckRvTUMocGFyYWxsZWw6OmRldGVjdENvcmVzKCktMSkgIyBwYXJhbGxlbCBiYWNrZW5kIChmb3IgVU5JWCkKCnN5c3RlbS50aW1lKHsKICByZXMgPC0gZm9yZWFjaChpaT0yOm5jb2woZGF0LndpZGUpLC5wYWNrYWdlcyA9IGMoImRwbHlyIiwiYXV0b1RTIikpICVkb3BhciUKICBwaXBlbGluZShkYXQud2lkZSRkYXRlcyxwdWxsKGRhdC53aWRlLGlpKSkKfSkKbmFtZXMocmVzKSA8LSBjb2xuYW1lcyhkYXQud2lkZSlbLTFdCnN0cihyZXMpCmBgYAoKIyMgVGhlcmUgaXMgbm8gZnJlZSBsdW5jaC4uLgoKVGhlcmUgaXMgbm8gYmVzdCBhbGdvcml0aG0gaW4gZ2VuZXJhbCAkXFJpZ2h0YXJyb3ckIGRlcGVuZHMgb24gdGhlIGRhdGEgIQoKYGBge3J9CnNhcHBseShyZXMsZnVuY3Rpb24oeHgpIGNvbG5hbWVzKHNlbGVjdCh4eCwtZGF0ZXMsLXR5cGUsLWFjdHVhbC52YWx1ZSkpICkgJT4lIHRhYmxlKCkKc2FwcGx5KHJlcyxmdW5jdGlvbih4eCkgY29sbmFtZXMoc2VsZWN0KHh4LC1kYXRlcywtdHlwZSwtYWN0dWFsLnZhbHVlKSkgKQpgYGAKCg==